package com.panda.web.utils;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.panda.web.entity.wechat.WechatUser;
import com.sun.tools.javac.Main;
import org.springframework.core.io.ClassPathResource;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.apache.commons.io.IOUtils.toByteArray;

public class MergePDFs {

    public  static void main(String[] args) {
        String dynamicPdfPath = "C:/Users/Administrator/Desktop/项目文件/智能求职软件/aaa.pdf"; // 动态生成的 PDF 路径
        String fixedPdfPath = "C:/Users/Administrator/Desktop/项目文件/智能求职软件/AAAAA.pdf"; // 固定数据的 PDF 路径
        String mergedPdfPath = "C:/Users/Administrator/Desktop/项目文件/智能求职软件/merged_output.pdf"; // 合并后的 PDF 路径

        try {
            // 1. 动态生成 PDF
            createDynamicPDF(dynamicPdfPath);

            // 2. 合并动态生成的 PDF 和固定数据的 PDF
            mergePDFs(dynamicPdfPath, fixedPdfPath, mergedPdfPath);

            System.out.println("PDF 合并成功，输出文件: " + mergedPdfPath);
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("PDF 生成或合并失败: " + e.getMessage());
        }
    }

    /**
     * 动态生成 PDF 文件
     */
    private synchronized static void createDynamicPDF(String outputPath) throws Exception {
        String pdfPath = "C:/Users/Administrator/Desktop/项目文件/智能求职软件/aaa.pdf"; // 输出PDF路径

        try {
            // 1. 创建PDF文档
            Document document = new Document(PageSize.A4,50,30,70,50); // 使用A4纸张大小
            PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
            document.open();

//            // 2. 添加标题图片
//            String titleImagePath = "C:/Users/Administrator/Desktop/项目文件/智能求职软件/zdl.jpg";
//            Image titleImage = Image.getInstance(titleImagePath); // 使用本地图片路径
//            titleImage.scaleToFit(450, 100); // 固定图片大小为450x100
//            titleImage.setAlignment(Element.ALIGN_LEFT); // 图片靠左对齐
//            document.add(titleImage);
            // 2. 添加标题图片
            String titleImagePath = "static/zdl.jpg"; // 图片位于 resources/static 目录下
            ClassPathResource resource = new ClassPathResource(titleImagePath);

            try (InputStream inputStream = resource.getInputStream()) {
                Image titleImage = Image.getInstance(inputStream.readAllBytes());
                titleImage.scaleToFit(PageSize.A4.getWidth() - 50, 100); // 调整图片大小
                titleImage.setAlignment(Element.ALIGN_CENTER);
                document.add(titleImage);
            } catch (Exception e) {
                e.printStackTrace();
                System.err.println("无法加载标题图片，请检查路径是否正确。");
            }
            // 3. 添加换行，确保表格内容不与图片重叠
            document.add(Chunk.NEWLINE);

            // 4. 创建第一个表格，宽度为500，高度为30
            PdfPTable table1 = new PdfPTable(1); // 1列
            table1.setWidthPercentage(100); // 设置表格宽度为页面的100%


            //加载resources 下的Fonts 字体-----------------------------------------------------------------------------
            // 加载微软雅黑字体
            InputStream fontStream = Main.class.getClassLoader().getResourceAsStream("Fonts/msyh.ttc");
            if (fontStream == null) {
                throw new IOException("字体文件 msyh.ttc 未找到！");
            }
            byte[] fontData = toByteArray(fontStream);
            BaseFont baseFont = BaseFont.createFont("msyh.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, BaseFont.CACHED, fontData, null);
            BaseFont baseFontH = BaseFont.createFont("msyh.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, BaseFont.CACHED, fontData, null);

            // 加载黑体字体（SimHei）
            InputStream simHeiStream = Main.class.getClassLoader().getResourceAsStream("Fonts/simhei.ttf");
            if (simHeiStream == null) {
                throw new IOException("字体文件 simhei.ttf 未找到！");
            }
            byte[] simHeiData = toByteArray(simHeiStream);
            BaseFont simHei = BaseFont.createFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, BaseFont.CACHED, simHeiData, null);

            // 加载汉仪粗圆简字体（HYCuYuanJ）
            InputStream hyCuYuanJStream = Main.class.getClassLoader().getResourceAsStream("Fonts/HYCuYuanJ.ttf");
            if (hyCuYuanJStream == null) {
                throw new IOException("字体文件 HYCuYuanJ.ttf 未找到！");
            }
            byte[] hyCuYuanJData = toByteArray(hyCuYuanJStream);
            BaseFont hyCuYuanJ = BaseFont.createFont("HYCuYuanJ.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, BaseFont.CACHED, hyCuYuanJData, null);

            // 创建 Font 对象
            Font font = new Font(baseFont, 20, Font.NORMAL); // 字体大小为20
            Font fontA = new Font(baseFont, 11, Font.NORMAL); // 字体大小为11
            Font fontB = new Font(baseFontH, 11, Font.BOLD); // 字体大小为12，加粗
            Font simHeiFont = new Font(simHei, 14, Font.NORMAL);
            Font hyCuYuanJFont = new Font(hyCuYuanJ, 26, Font.BOLD, BaseColor.RED); // 26pt，加粗，红色

            // 6. 创建第一个表格的单元格并设置内容
            PdfPCell cell1 = new PdfPCell();
            cell1.setFixedHeight(30); // 设置单元格高度为30
            Phrase phrase1 = new Phrase("央国企网申测评通用版", font); // 设置字体和文字

            // 7. 设置第一个表格的单元格内容
            cell1.setPhrase(phrase1);
            cell1.setHorizontalAlignment(Element.ALIGN_CENTER); // 内容水平居中
            cell1.setVerticalAlignment(Element.ALIGN_MIDDLE); // 内容垂直居中
            cell1.setBackgroundColor(BaseColor.LIGHT_GRAY); // 设置背景为灰色
            cell1.setBorder(Rectangle.BOX); // 显示完整的边框

            // 8. 将单元格添加到第一个表格
            table1.addCell(cell1);

            // 9. 将第一个表格添加到文档中
            document.add(table1);

            // 11. 创建第二个表格，宽度为500，高度为150
            PdfPTable table2 = new PdfPTable(1); // 1列
            table2.setWidthPercentage(100); // 设置表格宽度为页面的100%

            // 12. 创建第二个表格的单元格
            PdfPCell cell2 = new PdfPCell();
            cell2.setFixedHeight(150); // 设置单元格高度为150
            cell2.setBorder(Rectangle.BOX); // 显示完整的边框

            // 13. 设置第二个表格的内容
            Paragraph paragraph = new Paragraph();
            paragraph.setAlignment(Element.ALIGN_LEFT); // 整体靠左对齐

            // 第一行：同学您好：
            Phrase line1 = new Phrase("同学您好：\n", fontA);
            paragraph.add(line1);

            // 第二行：长文本，自动换行，行间距3
            Phrase line2 = new Phrase(
                    "经过我们对上万家央国企录用标准的分析，并结合了98位平均工作年龄在10年以上的央国企HR录用经验。这些数据经过AI就业大模型的训练后，总结出了以下量表，用以大致判断央国企的录用概率。此模型为通用模型，具体概率因地点、公司及岗位而略有差异。请根据结合自己情况，如实填写。",
                    fontA
            );
            paragraph.add(line2);
            // 设置行间距为1.5倍
            paragraph.setLeading(28);
            // 将段落添加到单元格
            cell2.addElement(paragraph);
            // 14. 将单元格添加到第二个表格
            table2.addCell(cell2);

            // 15. 将第二个表格添加到文档中
            document.add(table2);

            // 16. 创建第三个表格，用于填写个人信息
            PdfPTable table3 = new PdfPTable(6); // 6列
            table3.setWidthPercentage(100); // 设置表格宽度为页面的100%

            // 17. 设置表格的列宽比例
            float[] columnWidths = {1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f};
            table3.setWidths(columnWidths);

            // 18. 添加表头
            // 创建表头单元格，设置内容为“项目”，字体加粗
            PdfPCell headerCell = new PdfPCell(new Phrase("项目", fontB)); // 使用加粗字体
            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // 水平居中
            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);   // 垂直居中
            headerCell.setBorder(Rectangle.BOX);                     // 显示边框
            headerCell.setFixedHeight(40); // 设置单元格高度为30
            table3.addCell(headerCell);

            // 创建表头单元格，设置内容为“选项”，字体不加粗
            headerCell = new PdfPCell(new Phrase("选项", fontB)); // 使用不加粗字体
            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // 水平居中
            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);   // 垂直居中
            headerCell.setBorder(Rectangle.BOX);                     // 显示边框
            headerCell.setFixedHeight(40); // 设置单元格高度为30
            table3.addCell(headerCell);

            // 重复上述逻辑，添加剩余的表头单元格
            headerCell = new PdfPCell(new Phrase("项目",fontB)); // 使用加粗字体
            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            headerCell.setBorder(Rectangle.BOX);
            headerCell.setFixedHeight(40); // 设置单元格高度为30
            table3.addCell(headerCell);

            headerCell = new PdfPCell(new Phrase("选项", fontB)); // 使用不加粗字体
            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            headerCell.setBorder(Rectangle.BOX);
            headerCell.setFixedHeight(40); // 设置单元格高度为30
            table3.addCell(headerCell);

            headerCell = new PdfPCell(new Phrase("项目", fontB)); // 使用加粗字体
            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            headerCell.setBorder(Rectangle.BOX);
            headerCell.setFixedHeight(40); // 设置单元格高度为30
            table3.addCell(headerCell);

            headerCell = new PdfPCell(new Phrase("选项", fontB)); // 使用不加粗字体
            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            headerCell.setBorder(Rectangle.BOX);
            headerCell.setFixedHeight(40); // 设置单元格高度为30
            table3.addCell(headerCell);

            // 19. 添加动态数据行
            WechatUser user = new WechatUser(); // 假设这是从数据库或其他地方获取的用户数据
            user.setHuntingType("全职");
            user.setBackground("本科");
            user.setStressStatus("是");
            user.setAge(25);
            user.setGraduateTime("2023-06");
            user.setPolitics("党员");
            user.setSearchLocation("北京");
            user.setNativePlace("上海");
            user.setGraduateCity("上海");
            user.setGraduateType("985");
            user.setMajor("计算机科学与技术");
            user.setEnglishFour("是");
            user.setEnglishSix("否");
            user.setComputerTwo("是");
            user.setProjectExperience("a");
            user.setSkillCertificate("a");
            user.setCampusPractice("a");
            user.setScholarship("一等奖学金");
            user.setFamilyName("张");
            user.setSex("男");
            user.setPhone("13800138000");

            String[][] data = {
                    {"求职类型", user.getHuntingType(), "学历", user.getBackground(), "是否为应届", user.getStressStatus()},
                    {"年龄", user.getAge() != null ? user.getAge().toString() : "", "毕业时间", user.getGraduateTime(), "政治面貌", user.getPolitics()},
                    {"求职地点", user.getSearchLocation(), "籍贯", user.getNativePlace(), "毕业院校所在城市", user.getGraduateCity()},
                    {"毕业院校类别", user.getGraduateType(), "实习或项目经历", user.getProjectExperience() != null ? user.getProjectExperience().toString() : "", "就读专业", user.getMajor()},
                    {"语言能力4级", user.getEnglishFour(), "语言能力6级", user.getEnglishSix(), "计算机能力", user.getComputerTwo()},
                    {"技能证书", user.getSkillCertificate() != null ? user.getSkillCertificate().toString() : "", "校园实践", user.getCampusPractice() != null ? user.getCampusPractice().toString() : "", "获奖情况（含奖学金）", user.getScholarship()},
                    {"姓氏", user.getFamilyName(), "性别", user.getSex(), "联系方式", user.getPhone()}
            };
            // 遍历数据行
            for (String[] row : data) {
                for (int i = 0; i < row.length; i++) {
                    String cellData = row[i];
                    Font cellFont;

                    // 固定数据（如“求职类型”）使用加粗字体 FonB
                    if (i % 2 == 0) { // 固定数据在偶数索引位置
                        cellFont = fontB; // 加粗字体
                    } else { // 动态数据使用不加粗字体
                        cellFont = fontA; // 不加粗字体
                    }

                    PdfPCell dataCell = new PdfPCell(new Phrase(cellData != null ? cellData : "", cellFont));
                    dataCell.setHorizontalAlignment(Element.ALIGN_CENTER); // 水平居中
                    dataCell.setVerticalAlignment(Element.ALIGN_MIDDLE);   // 垂直居中
                    dataCell.setBorder(Rectangle.BOX);                     // 显示边框
                    dataCell.setFixedHeight(40); // 设置单元格高度为30
                    table3.addCell(dataCell);
                }
            }



            // 20. 将第三个表格添加到文档中
            document.add(table3);

            // 在就业竞争力添加分页
            document.newPage();

            java.util.List<String> advantages =new ArrayList<>(Arrays.asList("学历优势","b","学校优势","学校优势","学校优势","学校优势","学校优势","学校优势","学校优势","学校优势","学校优势","学校优势"));
            // 21. 添加就业竞争力部分

            Paragraph competitiveness = new Paragraph("1. 就业竞争力\n", simHeiFont);
            competitiveness.add(new Paragraph("\n"));  // 添加一个换行

            // 设置行间距（leading）
            float leading =50f; // 行间距为 20 个单位，可以根据需要调整
            competitiveness.setLeading(leading);
            // 动态生成优势文本
            for (String advantage : advantages) {
                competitiveness.add(new Phrase(advantage + " ", hyCuYuanJFont)); // 添加每个优势
            }
            competitiveness.add(new Paragraph("\n"));  // 添加一个换行
            document.add(competitiveness);


            // 假设这是动态获取的建议列表
            List<String> suggestionsList = new ArrayList<>();
            suggestionsList.add("您的总体得分为59分，选择央企风险过高，建议适当降低标准。");
            suggestionsList.add("您的学历是大专，建议您提升一下学历。（和第3条是或的关系）");
            suggestionsList.add("您的学历是本科，建议您提升一下学历。");
            suggestionsList.add("您非应届毕业生，可能被视为社招人员，降低竞争力。");
            suggestionsList.add("您的年龄为28岁，年龄优势不足，可能被视为社招人员，降低竞争力。");
            suggestionsList.add("您的求职地与户籍地/学校地不重合，尽量选择户籍所在地或院校所在地进行投递，央国企有地方保护政策。");
            suggestionsList.add("您没有实习/项目经历，央国企很重视实习或项目经历，建议积累相关实习经历，提高综合竞争力。");
            suggestionsList.add("您的英语未过四级，英语四级是大多数央国企的必要要求，建议提升英语能力，通过四级或考取其他英语证书。");
            // 22. 添加就业提升建议部分
            Paragraph suggestions = new Paragraph("2. 就业提升建议\n", simHeiFont);
            suggestions.add(new Paragraph("\n"));  // 添加一个换行


            // 动态生成建议并添加序号
            for (int i = 0; i < suggestionsList.size(); i++) {
                String suggestion = (i + 1) + "、 " + suggestionsList.get(i) + "\n";
                suggestions.add(new Phrase(suggestion, new Font(baseFont, 12, Font.NORMAL)));
            }

            // 将段落添加到文档中
            document.add(suggestions);


            // 23. 关闭文档
            document.close();



            System.out.println("PDF生成成功！");
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("PDF生成失败：" + e.getMessage());
        }
    }

    /**
     * 合并两个 PDF 文件
     */
    private static void mergePDFs(String dynamicPdfPath, String fixedPdfPath, String outputPath) throws IOException, DocumentException {
        // 创建输出 PDF 文档
        Document document = new Document();
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputPath));
        document.open();

        // 加载动态生成的 PDF
        PdfReader dynamicReader = new PdfReader(dynamicPdfPath);
        int dynamicPageCount = dynamicReader.getNumberOfPages();
        for (int i = 1; i <= dynamicPageCount; i++) {
            PdfImportedPage page = copy.getImportedPage(dynamicReader, i);
            copy.addPage(page);
        }
        dynamicReader.close();

        // 加载固定数据的 PDF
        PdfReader fixedReader = new PdfReader(fixedPdfPath);
        int fixedPageCount = fixedReader.getNumberOfPages();
        for (int i = 1; i <= fixedPageCount; i++) {
            PdfImportedPage page = copy.getImportedPage(fixedReader, i);
            copy.addPage(page);
        }
        fixedReader.close();

        // 关闭文档
        document.close();
    }
}